﻿#pragma once
#include "ADFGlobal.h"
#include "AsRoamingData.h"
#include "AsProcessCoreData.h"
#include "AsConfig.h"
#include <QSharedPointer>

// 全局数据池
class ADF_EXPORT AsGlobalDataPool : public QObject {
public:
	AsGlobalDataPool();
	~AsGlobalDataPool();

private:
	static QSharedPointer<AsGlobalDataPool> ms_spInstance;

public:
	static QSharedPointer<AsGlobalDataPool> getInstance();

private:
	QMap<int, QString>				m_mpType;
	QMap<QString, AsGlobalData*>	m_mpData;
	bool							m_bInit;

private:
	void initDefaultType();

public:
	// 全局对象池初始化
	void initialize();
	// 全局对象池反初始化
	void uninitialize();

public:
	// 对象获取
	AsGlobalData* getGlobalData(int key);
	// 获取所有的全局数据类型
	QMap<int, QString> getAllGlobalTypes();

public:
	/**
	 * @desc 全局类型注册，在全局对象池初始化前完成注册，全局对象池会自动创建一个该对象的实例
	 * @param
	 *	-T: 类型模板
	 *	-key: 注册的键名,参考#AsDefine::AsGlobalDataRole
	 */
	template<typename T>
	void registerType(int key) {
		if (m_bInit) {
			qDebug() << "Type must registered before global pool initialized!";
			return;
		}
		asRegisterMetaType<T>();
		m_mpType[key] = asMetaType<T>();
	}

};

namespace As {
	/**
	 * @desc 根据类型key获取指针
	 *	-T:类型模板
	 *	-key:注册的键名,参考#AsDefine::AsGlobalDataRole
	 */
	template<typename T>
	T* getGlobalData(int key)
	{
		AsGlobalData* pGlobal = AsGlobalDataPool::getInstance()->getGlobalData(key);
		if (pGlobal == nullptr) {
			return nullptr;
		}
		else {
			return (T*)pGlobal;
		}
	}

	/**
	 * @desc 注册全局元类型
	 */
	template<typename T>
	void registerGlobalMetaType(int key)
	{
		return AsGlobalDataPool::getInstance()->registerType<T>(key);
	}

	/**
	 * @desc 初始化全局对象池
	 * @param
	 * @tip:所有设置类工作必须在初始化前完成
	 */
	extern ADF_EXPORT void initGlobalDataPool();
	extern ADF_EXPORT void uninitGlobalDataPool();
	
	/**
	 * @desc 获取全局变量
	 */
	extern  ADF_EXPORT AsProcessCoreData* getCoreData();					//获取核心数据
	extern  ADF_EXPORT AsRoamingData* getRoamingData();					//获取运行时数据
	extern  ADF_EXPORT AsConfig* getConfig();							//获取配置文件

	/**
	 * @desc 一些内置的配置属性
	 */
	extern ADF_EXPORT bool isDebugMode();
	extern ADF_EXPORT void setDataDir(QString path);	//设置数据路径
	extern ADF_EXPORT QString getDataDir();				//获取数据路径
	extern ADF_EXPORT void setResultDir(QString path);	//设置结果路径
	extern ADF_EXPORT QString getResultDir();			//获取结果路径

	/**
	 * @desc 设置配置文件路径，需在全局对象池初始化设置
	 * @param
	 *	-filePath:配置文件路径
	 */
	void ADF_EXPORT setConfigFilePath(QString filePath);

	/**
	 * @desc 设置缓存文件路径，需在全局对象池初始化设置
	 * @param
	 *	-filePath:缓存文件路径
	 */
	void ADF_EXPORT setRoamingFilePath(QString filePath);

}